The present document relates to a system and a method for storing data. More specifically, the present document relates to a storage system architecture with separated data and control paths which provides efficient redundancy.
Traditional storage arrays follow an architecture that enables the storage array to employ two or more storage controllers which access the storage drives (HDDs or SSDs) over a storage bus. The controllers are equipped with CPU resources, memory, as well as custom hardware (e.g., FPGAs or ASICs). Using these resources, the controllers implement the storage functions, including virtualization, redundancy (e.g., RAID), fault tolerance, high-availability, storage protocols, volume reservations, and the processing of user requests in the data path. The storage clients (also called server computers or simply servers) access the storage resources (e.g., volumes) over a network, using the storage protocols that the storage array controllers implement. Therefore, all the processing of the user I/O requests occurs in the storage array controllers.
While such architectures have served well for more than 20 years, they suffer from the architectural limitation that the processing capabilities of the storage array do not scale with the aggregate performance of the storage drives. For example, as the number of drives (HDDs or SSDs) that are attached to the array increases (and therefore their aggregate throughput increases) the processing capabilities of the storage controllers remain the same. The same occurs as the storage drives are becoming faster, e.g., when using high-performance NVMe SSDs.